// 请你编写一个函数，它的参数为一个整数数组 nums 、一个计算函数 fn 和初始值 init 。返回一个数组 归约后 的值。
// 你可以定义一个数组 归约后 的值，然后应用以下操作： val = fn(init, nums[0]) ， val = fn(val, nums[1]) ，
//  val = fn(val, nums[2]) ，... 直到数组中的每个元素都被处理完毕。返回 val 的最终值。
// 如果数组的长度为 0，它应该返回 init 的值。
// 请你在不使用内置数组方法的 Array.reduce 前提下解决这个问题。
// 可以理解为模仿reduce函数

/**
 * @param {number[]} nums
 * @param {Function} fn
 * @param {number} init
 * @return {number}
 */
var reduce = function (nums, fn, init) {
  let res = 0
  for (let i = 0; i < nums.length; i++) {
    let as = fn(res, nums[i])
    res = as
  }
  return res + init
}

let arr = [1, 2, 3, 4]

function sum (accum, curr) {
  return accum + curr
}

let final = reduce(arr, sum, 100)
console.log(final)

var reduce2 = function (nums, fn, init) {
  let res = 0
  for (let i = 0; i < nums.length; i++) {
    let as = fn(res, nums[i])
    res = as
  }
  return res + init
}

function sum2 (accum, curr) {
  return accum + curr * curr
}

let final2 = reduce(arr, sum2, 100)
console.log(final2)
